package ar.uade.distribuidas.tpo.dba.dao;

import java.util.List;

import org.hibernate.Session;

import ar.uade.distribuidas.tpo.base.dominiodto.ItemListaPrecioDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ListaPrecioDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.RodamientoDTO;
import ar.uade.distribuidas.tpo.dba.dominio.ItemListaPrecio;
import ar.uade.distribuidas.tpo.dba.dominio.ListaPrecio;
import ar.uade.distribuidas.tpo.dba.hbt.HibernateDAO;

public class ItemListaPrecioDAO extends HibernateDAO {

	private static ItemListaPrecioDAO instance;

	private ItemListaPrecioDAO() {
		super();
	}

	public static ItemListaPrecioDAO getInstance() {
		if (instance == null) {
			instance = new ItemListaPrecioDAO();
		}
		return instance;
	}

	public void deleteItemListaPrecio(List<ItemListaPrecio> itemsListaP) {

		for (ItemListaPrecio itemC : itemsListaP) {
			this.delete(itemC);
		}
	}

	public ItemListaPrecioDTO getMejorPrecio(RodamientoDTO rod, int cant) {

		@SuppressWarnings("unchecked")
		List<ItemListaPrecio> lista = (List<ItemListaPrecio>) this.getSession()
				.createQuery(
						"from ItemListaPrecio ip where  "
								+ " ip.rodamiento.sufijo = :sufijo and  ip.rodamiento.marca = :marca and  ip.rodamiento.pais = :pais and"
								+ " ip.costo = (select min(costo) from ItemListaPrecio ips where "
								+ " ips.rodamiento.sufijo = :sufijo and  ips.rodamiento.marca = :marca and  ips.rodamiento.pais = :pais"
								+ " )")
				.setParameter("sufijo", rod.getSufijo())
				.setParameter("marca", rod.getMarca())
				.setParameter("pais", rod.getPais()).list();
				//.setParameter("cantidad", cant).list();

		ItemListaPrecioDTO item = null;
		
		if(lista != null && !lista.isEmpty())
			item = lista.get(0).toDTO();
	
		/*ListaPrecio listaPrecio = (ListaPrecio) session.createQuery("from ListaPrecio lp join lp.items item where items.id in (:id)")
				.setParameter("id", item.getIdItem()).uniqueResult();
		*/
		return item;
	}

	public ListaPrecioDTO getListaPrecioFromItem(ItemListaPrecioDTO iDTO) {

		ListaPrecio lista = (ListaPrecio) this.getSession()
				.createQuery(
						"from ListaPrecio list where (from ItemListaPrecio item where item.idItem = :idItem) in elements(list.items)")
				.setParameter("idItem", iDTO.getIdItem())
				.uniqueResult();

		return lista.toDTO();
	}
	
	/*public List<ItemListaPrecioDTO> getItemsListaPrecioFromRodamientos(List<RodamientoDTO> rodamientos){
	//from ItemListaPrecio p where (from Child c where c.Id = :childID) in elements(p.Children)
	
	Session session = this.getSf().openSession();
	ListaPrecio lista = (ListaPrecio) session
			.createQuery(
					"from ItemListaPrecio ip join ip.rodamiento item where item.nroSerie = :nroSerie")
			.setParameter("idItem", iDTO.getIdItem())
			.uniqueResult();
	session.close();
		
	return lista.toDTO();

	}*/
	
	
}
